package org.example.manager;

import java.io.Closeable;

/**
 * 对象容器
 *
 * @param <K> 目标对象的key类型
 * @param <V> 目标对象的类型
 */
public interface Manager<K, V> extends Closeable {

    /**
     * 注册颗粒
     *
     * @param k 与颗粒绑定的键
     * @param v 颗粒对象
     */
    void register(K k, V v);

    /**
     * 从容器中注销颗粒
     *
     * @param k 与颗粒绑定的键
     * @return 颗粒
     */
    V unregister(K k);

    /**
     * 从容器中查看颗粒，但不移除颗粒
     *
     * @param k 与颗粒绑定的键
     * @return 颗粒对象
     */
    V lookup(K k);

    /**
     * 获取容器对象
     *
     * @param <M> 容器的类型
     * @return 管理容器对象
     */
    <M extends Manager<K, V>> M lookup();
}
